#include "rept_event.h"
#include <QDebug>
#include <QFile>
#include <QDateTime>


QString Rept_event::getName(){
    return tr("Report - event");
}

bool Rept_event::init(const QString &lang){
    // подключаем перевод
    QTranslator * transrept = new QTranslator();
    if(transrept->load(QString(":/lang/report_event_%1.qm").arg(lang))){
        QCoreApplication::installTranslator(transrept);
    }
    this->isEventRequest=false;
    //qDebug()()<<" INIT "<<this->getName();
    return true;
}

bool Rept_event::execDia(){
    // здесь будет запускаться диалог настройки отчета.
    DiaPre dia;
    connect(&dia,SIGNAL(sigDTchanged(QString,QString)),this,SLOT(slotDiaDTchanged(QString,QString)));
    connect(this,SIGNAL(sigSetList(QStringList)),&dia,SLOT(slotSetList(QStringList)));
    connect(&dia,SIGNAL(sigEventRequest(QString,QString)),this,SLOT(slotEventRequest(QString,QString)));
    connect(this,SIGNAL(sigDiaFinish()),&dia,SLOT(slotFinish()));
    bool aa =  dia.startExec();
    disconnect(&dia,SIGNAL(sigDTchanged(QString,QString)),this,SLOT(slotDiaDTchanged(QString,QString)));
    disconnect(this,SIGNAL(sigSetList(QStringList)),&dia,SLOT(slotSetList(QStringList)));
    disconnect(&dia,SIGNAL(sigEventRequest(QString,QString)),this,SLOT(slotEventRequest(QString,QString)));
    disconnect(this,SIGNAL(sigDiaFinish()),&dia,SLOT(slotFinish()));
    return aa;
}

void Rept_event::slotDiaDTchanged(const QString &dfrom, const QString &dto){
    // изменена дата и время в списке событий, делаем запрос диапазона
    QStringList a;
    a.append(dfrom);
    a.append(dto);
    this->sigStartRequest(PLUGIN_NAME,"rept_event.geteventslist",a);
}

void Rept_event::slotFinishRequest(const QString &plugName, const QString &requestName, QStringList params){
    if(PLUGIN_NAME == PLUGIN_NAME){
        if(this->isEventRequest){
            // принимаем необходимые данные
            // обрабатываем их, формируем документ и отображаем его в новом диалоге.
            // из полученных данных надо извлеч в цикле имена продавцов и посчитать их суммы

            QMap<QString,int> vendistoj;
            for(int i = 0; i < params.size()/8; i++){
                if(params.at(i*8+7).toInt()==0){
                if(vendistoj.contains(params.at(i*8+4))){
                    vendistoj.insert(params.at(i*8+4),vendistoj.value(params.at(i*8+4))+params.at(i*8+2).toInt());

                }else{
                    vendistoj.insert(params.at(i*8+4),params.at(i*8+2).toInt());

                }
                }
            }
            // продавцы и сумма возвращенных билетов
            QMap<QString,int> vendistojRet;
            for(int i = 0; i < params.size()/8; i++){
                if(params.at(i*8+7).toInt()==1){
                if(vendistojRet.contains(params.at(i*8+4))){
                    vendistojRet.insert(params.at(i*8+4),vendistojRet.value(params.at(i*8+4))+params.at(i*8+2).toInt());

                }else{
                    vendistojRet.insert(params.at(i*8+4),params.at(i*8+2).toInt());

                }
                }
            }

            // считаем итоговую сумму по тарифам проданных и возвращенных билетов
            QMap<QString,int> tariffsSale;
            for(int i = 0; i < params.size()/8; i++){

                if(params.at(i*8+7).toInt()==0){
                if(tariffsSale.contains(params.at(i*8+3))){
                    tariffsSale.insert(params.at(i*8+3),tariffsSale.value(params.at(i*8+3))+params.at(i*8+2).toInt());

                }else{
                    tariffsSale.insert(params.at(i*8+3),params.at(i*8+2).toInt());

                }
                }
            }

            QMap<QString,int> tariffsRet;
            for(int i = 0; i < params.size()/8; i++){

                if(params.at(i*8+7).toInt()==1){
                if(tariffsRet.contains(params.at(i*8+3))){
                    tariffsRet.insert(params.at(i*8+3),tariffsRet.value(params.at(i*8+3))+params.at(i*8+2).toInt());

                }else{
                    tariffsRet.insert(params.at(i*8+3),params.at(i*8+2).toInt());

                }
                }
            }



            // извлекли и посчитали, теперь вынимаем шаблон и записываем туда данные

            QFile a;
            a.setFileName(":/resources/report_event_modelo.html");
            a.open(QIODevice::ReadOnly | QIODevice::Text);
            // кракозябры блеять
            QString ht = QString::fromUtf8(a.readAll());

            // обрабатываем шаблон.
            // заполняем табличку №1
            // генерируем ячейки
            QString tb;
            int sch=0;
            for(int i = 0; i < params.size()/8; i++){
                if(params.at(i*8+7).toInt()==0){

                tb.append("<tr>");
                tb.append("<td>");
                sch++;
                tb.append(QString::number(sch));
                tb.append("</td>");
                for(int j = 0; j < 5; j++){

                    tb.append("<td>");
                    tb.append(params.at(i*8+j));
                    tb.append("</td>");

                }

                tb.append("</tr>");
                }
            }
            ht.replace("$table_1$",tb);

            // заполняем табличку №2
             tb.clear();

             foreach (QString str, vendistoj.keys()){
                // считаем тарифы
                 QMap<QString,int> trf;
                 for(int i = 0; i < params.size()/8; i++){
                     if(params.at(i*8+7).toInt()==0 and params.at(i*8+4) == str){
                     if(trf.contains(params.at(i*8+3))){
                         trf.insert(params.at(i*8+3),trf.value(params.at(i*8+3))+1);

                     }else{
                         trf.insert(params.at(i*8+3),1);

                     }
                     }
                 }

                 tb.append("<tr>");
                 tb.append("<td>");
                 tb.append(str);
                 tb.append("</td><td>");
                 tb.append(QString::number(vendistoj.value(str)));
                 tb.append("</td>");
                 tb.append("<td>");
                 // выкладываем тарифы
                 foreach(QString trfstr, trf.keys()){
                     tb.append(trfstr);
                     tb.append(" - ");
                     tb.append(QString::number(trf.value(trfstr)));
                     tb.append("<br>");
                 }

                 tb.append("</td>");
                 tb.append("</tr>");
             }

             ht.replace("$table_2$",tb);

             // заполняем табличку тарифов
                tb.clear();
                int summ_s = 0;
             foreach (QString str, tariffsSale.keys()){

                 tb.append("<tr>");
                 tb.append("<td>");
                 tb.append(str);
                 tb.append("</td><td>");
                 tb.append(QString::number(tariffsSale.value(str)));
                 summ_s+=tariffsSale.value(str);
                 tb.append("</td>");
                 tb.append("</tr>");
             }
            ht.replace("$table_2T$",tb);
            ht.replace("$B_SUMM_S$",QString::number(summ_s));


             // заполняем табличку №3
             // генерируем ячейки
                tb.clear();
                int sh = 0;
             for(int i = 0; i < params.size()/8; i++){
                 if(params.at(i*8+7).toInt()==1){
                 tb.append("<tr>");
                 tb.append("<td>");
                 sh++;
                 tb.append(QString::number(sh));
                 tb.append("</td>");
                 for(int j = 0; j < 7; j++){


                     tb.append("<td>");
                     tb.append(params.at(i*8+j));
                     tb.append("</td>");

                 }

                 tb.append("</tr>");
                 }
             }
             ht.replace("$table_3$",tb);

             // заполняем табличку №4
              tb.clear();

              foreach (QString str, vendistojRet.keys()){
                  // считаем тарифы
                   QMap<QString,int> trf;
                   for(int i = 0; i < params.size()/8; i++){
                       if(params.at(i*8+7).toInt()==1 and params.at(i*8+4) == str){
                       if(trf.contains(params.at(i*8+3))){
                           trf.insert(params.at(i*8+3),trf.value(params.at(i*8+3))+1);

                       }else{
                           trf.insert(params.at(i*8+3),1);

                       }
                       }
                   }
                  tb.append("<tr>");
                  tb.append("<td>");
                  tb.append(str);
                  tb.append("</td><td>");
                  tb.append(QString::number(vendistojRet.value(str)));
                  tb.append("</td>");
                  tb.append("<td>");
                  // выкладываем тарифы
                  foreach(QString trfstr, trf.keys()){
                      tb.append(trfstr);
                      tb.append(" - ");
                      tb.append(QString::number(trf.value(trfstr)));
                      tb.append("<br>");
                  }

                  tb.append("</td>");
                  tb.append("</tr>");
                  tb.append("</tr>");
              }

              ht.replace("$table_4$",tb);
              // заполняем табличку тарифов
                 tb.clear();
                 int summ_r = 0;
              foreach (QString str, tariffsRet.keys()){

                  tb.append("<tr>");
                  tb.append("<td>");
                  tb.append(str);
                  tb.append("</td><td>");
                  tb.append(QString::number(tariffsRet.value(str)));
                  summ_r+=tariffsRet.value(str);
                  tb.append("</td>");
                  tb.append("</tr>");
              }
             ht.replace("$table_4T$",tb);
             ht.replace("$B_SUMM_R$",QString::number(summ_r));


             ht.replace("$EVENT_NAME$",this->EventName);
             ht.replace("$EVENT_DATE$",this->EventDate);
             ht.replace("$CURRENT_DT$",QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));

            // показываем диалог предварительного просмотра
            DiaPrint diapri;
            diapri.setText(ht);
            if(diapri.exec()){
                // понеслась печать.
                QPrinter printer;
                printer.setPageMargins(8,8,8,8,QPrinter::Millimeter);
                QPrintDialog *diaP = new QPrintDialog(&printer);

                if(diaP->exec() == QPrintDialog::Accepted){
                    diapri.getDoc()->print(&printer);
                }

            }
            //else{
                // пользователь все отменил, придурог. все зря. =(
            //}

            // второй этап печати отчета
            // небходимо распечатать памятку
            QFile b;
            b.setFileName(":/resources/report_event_memoragxo.html");
            b.open(QIODevice::ReadOnly | QIODevice::Text);
            // кракозябры блеять
            ht = QString::fromUtf8(b.readAll());
            // генерируем ячейки для таблицы в количестве проданных билетов $TABLE_1$
            QString rr;
            for(int i = 0; i < params.size()/8; i++){
                if(params.at(i*8+7).toInt()==0){
                    rr.append("<tr><td></td><td></td><td></td><td></td><td></td></tr>");
                }
            }
            ht.replace("$TABLE_1$",rr);



            diapri.setText(ht);
            if(diapri.exec()){
                // понеслась печать.
                QPrinter printer;
                printer.setPageMargins(8,8,8,8,QPrinter::Millimeter);
                QPrintDialog *diaP = new QPrintDialog(&printer);

                if(diaP->exec() == QPrintDialog::Accepted){
                    diapri.getDoc()->print(&printer);
                }

            }
            // закрываем диалог
            emit this->sigDiaFinish();

            // обязательно сбрасывваем флаг
            this->isEventRequest=false;

        }else{
            this->sigSetList(params);
        }
    }
}


void Rept_event::slotEventRequest(const QString &eName, const QString &eDate){
    // пользователь ткнул в ок на диалоге и полетел запрос конкретного события
    // выставляем флаг, что полетел запрос именно на событие
    this->isEventRequest=true;
    this->EventName=eName;
    this->EventDate=eDate;
    QStringList a;
    a.append(eName);
    a.append(eDate);
    this->sigStartRequest(PLUGIN_NAME,"rept_event.getevtick",a);
}

Q_EXPORT_PLUGIN2(iface_rept,Rept_event)
